iT邦幫忙

2022 iThome 鐵人賽

DAY 4
3

Day 4 模組化

現在多數的 Discord Bot 的概念,都是一個 Bot 對應到多個 Guild,就跟一般人在 Discord 時一樣,一個人加入多個伺服器。如果在這種模型下,每個模組必須獨立進行信息的分類,導致程式碼的重複性及複雜性都會增加。

// Module A
client.on("messageCreate", (message) => {
    // 這裡,我們不知道 message 是從哪個伺服器(或 DM 頻道)發出的
});

// Module B
client.on("messageCreate", (message) => {
    // 這裡,我們不知道 message 是從哪個伺服器(或 DM 頻道)發出的
});

甚至,如果有多個模組對於相同事件回應的話,就會造成衝突(interaction 只能 reply 一次)。

但是,在實務上從 Bot 的角度來看,每個 Guild 對應到的 Bot 都不太相同,針對不同的 Guild 會有不同的設定,例如說權限、指令、是不是付費伺服器等等,這部分的成本如果轉移到框架的範圍,就可以讓開發者專注在模組本身的邏輯上。再者,事實上 1-n 的概念在大型 Discord Bot 中是行不通的,因為當加入的伺服器過多時,Discord 會要求進行 Sharding,也就是將一個 Bot 分割成多個 Bot,每個 Bot 只負責一部分的伺服器,既然如此,何不一開始就用 1-1 的模型呢?

我們可以針對不同的 Guild 建立獨立的 Pipeline 來處理事件。

ExpressKoa 這類的網頁伺服器框架,都有一個 .use() 來使用 middleware,我們或許也可以這麼做。

const bot = new Bot(TOKEN);

bot.use(new Module({
    // 模組的設定
}));

bot.start();

我們的模組也許會長這樣:

class Module {
    intents = [
        GatewayIntentBits.MessageContent,
        GatewayIntentBits.Guilds,
        GatewayIntentBits.GuildMessages,
    ];

    async message({ msg, guild, reply }): Promise<boolean> {
        if (!guild) {
            return false;
        }

        if (msg.content === "ping") {
            await reply("pong");
            return true;
        }
    }
}

總而言之,我們可以建立一個與 Koa 類似的洋蔥模型來處理事件,為了使:

  • 模組可以混用,即使對相同的事件回應,依照順序不會互相衝突
  • 各模組需要用的意圖在模組層級定義
  • 模組可以獨立開發,並且可以在不同的 Bot 中使用
  • 對於每個 Guild 具有封閉性,可以有不同的模組配置

每日鐵人賽熱門 Top 10 (2022-09-19)

以 2022/09/18 20:00 ~ 2022/09/19 20:00 文章觀看數增加值排名

誤差: 1 小時

  1. +3770 D01 - 沒時間解釋了,快上車!
    • 作者: 鱈魚
    • 系列:派對動物嗨起來!
  2. +774 D05 - 飄吧!多邊形!
    • 作者: 鱈魚
    • 系列:派對動物嗨起來!
  3. +734 D03 - 建立專案
    • 作者: 鱈魚
    • 系列:派對動物嗨起來!
  4. +349 「全端挑戰」學習Mern全端開發概念與動態網站開發流程懶人包
    • 作者: SamKo
    • 系列:自己做一個價值幾十萬的動態網站,學會Mern開發、前台UI設計各式觀念與各式Lib、typescript你該學會的前端技術
  5. +342 了解Scss與React Component與首頁概念圖與UI實作
    • 作者: SamKo
    • 系列:自己做一個價值幾十萬的動態網站,學會Mern開發、前台UI設計各式觀念與各式Lib、typescript你該學會的前端技術
  6. +309 架設環境、了解npm指令、React與React Dom與創建第一個ReactApp
    • 作者: SamKo
    • 系列:自己做一個價值幾十萬的動態網站,學會Mern開發、前台UI設計各式觀念與各式Lib、typescript你該學會的前端技術
  7. +271 Scss與React Component的動態實作Navbar與Header
    • 作者: SamKo
    • 系列:自己做一個價值幾十萬的動態網站,學會Mern開發、前台UI設計各式觀念與各式Lib、typescript你該學會的前端技術
  8. +189 Day01 - 為什麼要裝 Node.js?
    • 作者: rocketpencil
    • 系列:因為拖延症而沒有好好準備有系統性文章架構的我只能靠一天一筆記來贖罪
  9. +146 第 15 話 面對年齡的思考與能力上要評估的思維
    • 作者: Tim Hsu
    • 系列:進擊的轉職-平面設計邁向前端工程師之奇幻旅程
  10. +127 終究都要學 React 何不現在學呢? - React 基礎 - React 是什麼? - (1)
    • 作者: Ray
    • 系列:終究都要學 React 何不現在學呢?

是不是有人偷刷瀏覽次數?可惡,我也好想刷!


上一篇
Day 3 準備部署環境
下一篇
Day 5 實作 Ping 和 Timing 模組
系列文
Discord Bot with TypeScript: Framework, Database, and Modules30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言